package com.smart.community.commons.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 状态枚举
 * 统一管理系统中的通用状态
 * 
 * @author Wu.Liang
 * @since 2025-07-05
 * @version 1.0.0
 */
@Getter
@AllArgsConstructor
public enum StatusEnum {
    
    /**
     * 禁用
     */
    DISABLED(0, "禁用"),
    
    /**
     * 启用
     */
    ENABLED(1, "启用"),
    
    /**
     * 锁定
     */
    LOCKED(2, "锁定"),
    
    /**
     * 待审核
     */
    PENDING(3, "待审核"),
    
    /**
     * 审核通过
     */
    APPROVED(4, "审核通过"),
    
    /**
     * 审核拒绝
     */
    REJECTED(5, "审核拒绝"),
    
    /**
     * 已删除
     */
    DELETED(1, "已删除"),
    
    /**
     * 未删除
     */
    NOT_DELETED(0, "未删除");
    
    @JsonValue
    private final Integer code;
    private final String name;
    
    /**
     * 根据代码获取枚举
     * 
     * @param code 状态代码
     * @return 状态枚举
     */
    public static StatusEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (StatusEnum status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return null;
    }
    
    /**
     * 根据代码获取状态名称
     * 
     * @param code 状态代码
     * @return 状态名称
     */
    public static String getNameByCode(Integer code) {
        StatusEnum status = getByCode(code);
        return status != null ? status.getName() : "未知";
    }
    
    /**
     * 检查是否为启用状态
     * 
     * @param code 状态代码
     * @return 是否为启用状态
     */
    public static boolean isEnabled(Integer code) {
        return ENABLED.getCode().equals(code);
    }
    
    /**
     * 检查是否为禁用状态
     * 
     * @param code 状态代码
     * @return 是否为禁用状态
     */
    public static boolean isDisabled(Integer code) {
        return DISABLED.getCode().equals(code);
    }
    
    /**
     * 检查是否为锁定状态
     * 
     * @param code 状态代码
     * @return 是否为锁定状态
     */
    public static boolean isLocked(Integer code) {
        return LOCKED.getCode().equals(code);
    }
    
    /**
     * 检查是否为待审核状态
     * 
     * @param code 状态代码
     * @return 是否为待审核状态
     */
    public static boolean isPending(Integer code) {
        return PENDING.getCode().equals(code);
    }
    
    /**
     * 检查是否为审核通过状态
     * 
     * @param code 状态代码
     * @return 是否为审核通过状态
     */
    public static boolean isApproved(Integer code) {
        return APPROVED.getCode().equals(code);
    }
    
    /**
     * 检查是否为审核拒绝状态
     * 
     * @param code 状态代码
     * @return 是否为审核拒绝状态
     */
    public static boolean isRejected(Integer code) {
        return REJECTED.getCode().equals(code);
    }
    
    /**
     * 检查是否为已删除状态
     * 
     * @param code 状态代码
     * @return 是否为已删除状态
     */
    public static boolean isDeleted(Integer code) {
        return DELETED.getCode().equals(code);
    }
    
    /**
     * 检查是否为未删除状态
     * 
     * @param code 状态代码
     * @return 是否为未删除状态
     */
    public static boolean isNotDeleted(Integer code) {
        return NOT_DELETED.getCode().equals(code);
    }
    
    /**
     * 检查状态代码是否有效
     * 
     * @param code 状态代码
     * @return 是否有效
     */
    public static boolean isValidCode(Integer code) {
        return getByCode(code) != null;
    }
    
    /**
     * 获取所有状态代码数组
     * 
     * @return 状态代码数组
     */
    public static Integer[] getAllCodes() {
        StatusEnum[] values = values();
        Integer[] codes = new Integer[values.length];
        for (int i = 0; i < values.length; i++) {
            codes[i] = values[i].getCode();
        }
        return codes;
    }
    
    /**
     * 获取基础状态代码数组（启用/禁用）
     * 
     * @return 基础状态代码数组
     */
    public static Integer[] getBasicCodes() {
        return new Integer[]{DISABLED.getCode(), ENABLED.getCode()};
    }
    
    /**
     * 获取审核状态代码数组
     * 
     * @return 审核状态代码数组
     */
    public static Integer[] getAuditCodes() {
        return new Integer[]{PENDING.getCode(), APPROVED.getCode(), REJECTED.getCode()};
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static StatusEnum fromCode(Integer code) {
        return getByCode(code);
    }
} 